home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / recvbark.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-10  |  2.9 KB  |  157 lines

  1. #include <stdio.h>
  2. #include "lutil.h"
  3. #include "ttyio.h"
  4. #include "session.h"
  5. #include "statetbl.h"
  6.  
  7. int recvbark(void);
  8.  
  9. static int recv_bark(void);
  10. extern unsigned short crc16(char*,int);
  11. extern int xmsndfiles(file_list*);
  12. extern file_list *respond_bark(char*);
  13.  
  14. int recvbark(void)
  15. {
  16.     if ((session_flags&SESSION_BARK) && !(localoptions&NOFREQS))
  17.     {
  18.         return recv_bark();
  19.     }
  20.     else /* deny requests */
  21.     {
  22.         PUTCHAR(CAN);
  23.         return STATUS;
  24.     }
  25. }
  26.  
  27. SM_DECL(recv_bark,"recvbark")
  28. SM_STATES
  29.     sendenq,waitack,waitchar,scanreq,sendack,
  30.     waitnak,sendfiles
  31. SM_NAMES
  32.     "sendenq","waitack","waitchar","scanreq","sendack",
  33.     "waitnak","sendfiles"
  34. SM_EDECL
  35.  
  36.     int c,c1,c2;
  37.     short lcrc,rcrc;
  38.     char buf[256],*p=NULL;
  39.     int count=0,rc=0;
  40.     file_list *tosend=NULL;
  41.  
  42. SM_START(sendenq)
  43.  
  44. SM_STATE(sendenq)
  45.  
  46.     if (count++ > 6)
  47.     {
  48.         loginf("failed to get bark request");
  49.         SM_ERROR;
  50.     }
  51.  
  52.     PUTCHAR(ENQ);
  53.     if (STATUS) {SM_ERROR;}
  54.     else {SM_PROCEED(waitack);}
  55.  
  56. SM_STATE(waitack)
  57.  
  58.     c=GETCHAR(15);
  59.     if (c == TIMEOUT) 
  60.     {
  61.         debug(10,"recvbark got timeout waiting for ACK");
  62.         SM_PROCEED(sendenq);
  63.     }
  64.     else if (c < 0)
  65.     {
  66.         SM_ERROR;
  67.     }
  68.     else switch (c)
  69.     {
  70.     case ACK:    p=buf; SM_PROCEED(waitchar); break;
  71.     case ETB:    SM_SUCCESS; break;
  72.     case ENQ:    PUTCHAR(ETB); SM_PROCEED(waitack); break;
  73.     case EOT:    PUTCHAR(ACK); SM_PROCEED(waitack); break;
  74.     default:    debug(10,"recvbark got '%s' waiting for ACK",
  75.                 printablec(c));
  76.             SM_PROCEED(waitack); break;
  77.     }
  78.  
  79. SM_STATE(waitchar)
  80.  
  81.     c=GETCHAR(15);
  82.     if (c == TIMEOUT) 
  83.     {
  84.         debug(10,"recvbark got timeout waiting for char");
  85.         SM_PROCEED(sendenq);
  86.     }
  87.     else if (c < 0)
  88.     {
  89.         SM_ERROR;
  90.     }
  91.     else switch (c)
  92.     {
  93.     case ACK:    SM_PROCEED(waitchar); break;
  94.     case ETX:    *p='\0'; SM_PROCEED(scanreq); break;
  95.     case SUB:    SM_PROCEED(sendenq); break;
  96.     default:    if ((p-buf) < sizeof(buf)) *p++=c;
  97.             SM_PROCEED(waitchar); break;
  98.     }
  99.  
  100. SM_STATE(scanreq)
  101.  
  102.     lcrc=crc16(buf,strlen(buf));
  103.     c1=GETCHAR(15);
  104.     if (c1 == TIMEOUT) {SM_PROCEED(sendenq);}
  105.     else if (c1 < 0) {SM_ERROR;}
  106.     c2=GETCHAR(15);
  107.     if (c2 == TIMEOUT) {SM_PROCEED(sendenq);}
  108.     else if (c2 < 0) {SM_ERROR;}
  109.     rcrc=(c2<<8)+(c1&0xff);
  110.     if (lcrc != rcrc)
  111.     {
  112.         debug(10,"lcrc 0x%04x != rcrc 0x%04x",lcrc,rcrc);
  113.         SM_PROCEED(sendenq);
  114.     }
  115.     SM_PROCEED(sendack);
  116.  
  117. SM_STATE(sendack)
  118.  
  119.     count=0;
  120.     PUTCHAR(ACK);
  121.     tosend=respond_bark(buf);
  122.     SM_PROCEED(waitnak);
  123.  
  124. SM_STATE(waitnak)
  125.  
  126.     c=GETCHAR(15);
  127.     if (c == TIMEOUT) 
  128.     {
  129.         debug(10,"recvbark got timeout waiting for NAK");
  130.         SM_PROCEED(sendenq);
  131.     }
  132.     else if (c < 0)
  133.     {
  134.         SM_ERROR;
  135.     }
  136.     else switch (c)
  137.     {
  138.     case NAK:    session_flags &= ~FTSC_XMODEM_CRC; /* fallthrough */
  139.     case 'C':    session_flags |= FTSC_XMODEM_CRC;
  140.             SM_PROCEED(sendfiles); break;
  141.     case ENQ:    PUTCHAR(ETB); SM_PROCEED(waitack); break;
  142.     case SUB:    SM_PROCEED(sendenq); break;
  143.     default:    debug(10,"recvbark got '%s' waiting for NAK",
  144.                 printablec(c));
  145.             SM_PROCEED(waitack); break;
  146.     }
  147.  
  148. SM_STATE(sendfiles)
  149.  
  150.     rc=xmsndfiles(tosend);
  151.     tidy_filelist(tosend,0);
  152.     if (rc == 0) {SM_PROCEED(sendenq);}
  153.     else {SM_ERROR;}
  154.  
  155. SM_END
  156. SM_RETURN
  157.